// Scintilla source code edit control
/** @file CallTip.h
 ** Interface to the call tip control.
 **/
// Copyright 1998-2001 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.

#ifndef CALLTIP_H
#define CALLTIP_H

namespace Scintilla {

struct Chunk {
  size_t start;
  size_t end;
  Chunk(size_t start_ = 0, size_t end_ = 0) noexcept : start(start_), end(end_) {
    assert(start <= end);
  }
  size_t Length() const noexcept;
};

/**
 */
class CallTip {
  Chunk highlight;  // character offset to start and end of highlighted text
  std::string val;
  Font font;
  PRectangle rectUp;     // rectangle of last up angle in the tip
  PRectangle rectDown;   // rectangle of last down arrow in the tip
  int lineHeight;        // vertical line spacing
  int offsetMain;        // The alignment point of the call tip
  int tabSize;           // Tab size in pixels, <=0 no TAB expand
  bool useStyleCallTip;  // if true, STYLE_CALLTIP should be used
  bool above;            // if true, display calltip above text

  int DrawChunk(Surface* surface, int x, const char* s, size_t len, int ytext, PRectangle rcClient,
                bool asHighlight, bool draw);
  int PaintContents(Surface* surfaceWindow, bool draw);
  bool IsTabCharacter(char ch) const noexcept;
  int NextTabPos(int x) const noexcept;

 public:
  Window wCallTip;
  Window wDraw;
  bool inCallTipMode;
  Sci::Position posStartCallTip;
  ColourDesired colourBG;
  ColourDesired colourUnSel;
  ColourDesired colourSel;
  ColourDesired colourShade;
  ColourDesired colourLight;
  int codePage;
  int clickPlace;

  int insetX;  // text inset in x from calltip border
  int widthArrow;
  int borderHeight;
  int verticalOffset;  // pixel offset up or down of the calltip with respect to the line

  CallTip() noexcept;
  // Deleted so CallTip objects can not be copied.
  CallTip(const CallTip&) = delete;
  CallTip(CallTip&&) = delete;
  CallTip& operator=(const CallTip&) = delete;
  CallTip& operator=(CallTip&&) = delete;
  ~CallTip();

  void PaintCT(Surface* surfaceWindow);

  void MouseClick(Point pt) noexcept;

  /// Setup the calltip and return a rectangle of the area required.
  PRectangle CallTipStart(Sci::Position pos, Point pt, int textHeight, const char* defn,
                          const char* faceName, int size, int codePage_, int characterSet,
                          int technology, const Window& wParent);

  void CallTipCancel();

  /// Set a range of characters to be displayed in a highlight style.
  /// Commonly used to highlight the current parameter.
  void SetHighlight(size_t start, size_t end);

  /// Set the tab size in pixels for the call tip. 0 or -ve means no tab expand.
  void SetTabSize(int tabSz) noexcept;

  /// Set calltip position.
  void SetPosition(bool aboveText) noexcept;

  /// Used to determine which STYLE_xxxx to use for call tip information
  bool UseStyleCallTip() const noexcept;

  // Modify foreground and background colours
  void SetForeBack(const ColourDesired& fore, const ColourDesired& back) noexcept;
};

}  // namespace Scintilla

#endif
